﻿using System.Collections.Generic;
using System.Windows;
using System.Linq;

namespace ibba.src.noriskbo
{
    public static class AsyncSingletonQualidadeGarantia 
    {
        public delegate void EndAsyncResult(List<ServiceGarantia.QualidadeGarantia> pEndAsyncResult);
        private static event EndAsyncResult OnEndAsyncResult;

        private static readonly object syncLock = new object();

        private static List<ServiceGarantia.QualidadeGarantia> _instance;
        private static bool _inProgress = false;

        public static void ObterLista(EndAsyncResult pEndAsyncResult)
        {
            lock (syncLock)
            {
                if (_instance == null)
                {
                    OnEndAsyncResult += pEndAsyncResult;

                    if (_inProgress == false)
                    {
                        _inProgress = true;

                        ServiceFactory.Instance.ServiceGarantia.BeginObterQualidadesGarantia((pAsyncResult) =>
                        {
                            Deployment.Current.Dispatcher.BeginInvoke(delegate()
                            {
                                var retorno = ((ServiceGarantia.IServiceGarantia)pAsyncResult.AsyncState).EndObterQualidadesGarantia(pAsyncResult);

                                //var result = new List<ServiceCorporativo.ProdutoModalidade>();
                                //result.Add(new ObterListaTipoCorVeiculo_Result { Id = 0, Descricao = "" });

                                //if (RetornoServicoHelper.RetornoOk(retorno))
                                //{
                                //    result.AddRange(retorno.Retornok__BackingField);
                                //    _Instance = result;
                                //}

                                _instance = retorno;

                                //_instrumentos = (from q in retorno
                                //                 orderby q.DescricaoInstrumento
                                //                 select new ServiceCorporativo.Instrumento
                                //                 {
                                //                     IdInstrumento = q.CodigoInstrumento,
                                //                     Descricao = q.DescricaoInstrumento.Trim(),
                                //                     TransfereRisco = q.TransfereRisco
                                //                 }).Distinct().ToList();

                                _instrumentos = new List<ServiceCorporativo.Instrumento>();

                                foreach (var item in (from q in retorno
                                                      orderby q.DescricaoInstrumento
                                                      select new { q.CodigoInstrumento, q.DescricaoInstrumento, q.TransfereRisco }).Distinct())
                                {
                                    _instrumentos.Add(new ServiceCorporativo.Instrumento()
                                    {
                                        IdInstrumento = item.CodigoInstrumento,
                                        Descricao = item.DescricaoInstrumento.Trim(),
                                        TransfereRisco = item.TransfereRisco
                                    });
                                };

                                lock (syncLock)
                                {
                                    _inProgress = false;
                                }

                                OnEndAsyncResult(_instance);
                                OnEndAsyncResult = null;
                            });

                        }, ServiceFactory.Instance.ServiceGarantia);
                    }
                }
                else
                {
                    pEndAsyncResult(_instance);
                }

            }
        }

        
        private static List<ServiceCorporativo.Instrumento> _instrumentos;
        public static List<ServiceCorporativo.Instrumento> ObterListaInstrumentos()
        {
            return _instrumentos;
        }

        private static List<ServiceCorporativo.Bem> _bens;
        public static List<ServiceCorporativo.Bem> ObterListaBens(int pIdInstrumento)
        {
            _bens = new List<ServiceCorporativo.Bem>();

            foreach (var item in (from q in _instance
                                  where q.CodigoInstrumento == pIdInstrumento
                                  orderby q.DescricaoBem
                                  select new { q.CodigoInstrumento, q.CodigoBem, q.DescricaoBem }).Distinct())
            {
                _bens.Add(new ServiceCorporativo.Bem()
                {
                    IdInstrumento = item.CodigoInstrumento,
                    IdBem = item.CodigoBem,
                    Descricao = item.DescricaoBem
                });
            };

            return _bens;

        }

        public static List<ServiceCorporativo.Natureza> ObterListaNaturezas(int pIdInstrumento, int pIdBem)
        {
            var result = new List<ServiceCorporativo.Natureza>();

            //result = (from q in _instance
            //          where q.CodigoInstrumento == pIdInstrumento && q.CodigoBem == pIdBem
            //          orderby q.DescricaoNatureza
            //          select new ServiceCorporativo.Natureza
            //          {
            //              CodigoBem = q.CodigoBem,
            //              CodigoNatureza = q.CodigoNatureza,
            //              IdNatureza = q.CodigoNatureza,
            //              DescricaoNatureza = q.DescricaoNatureza,
            //              Qualidade = decimal.Parse((q.QualidadeTrinca * 100).ToString("n2"))
            //          }).Distinct().ToList();

            foreach (var item in (from q in _instance
                                  where q.CodigoInstrumento == pIdInstrumento && q.CodigoBem == pIdBem
                                  orderby q.DescricaoNatureza
                                  select new { q.CodigoBem, q.CodigoNatureza, q.DescricaoNatureza, q.QualidadeTrinca }).Distinct())
            {
                result.Add(new ServiceCorporativo.Natureza()
                {
                    CodigoBem = item.CodigoBem,
                    CodigoNatureza = item.CodigoNatureza,
                    IdNatureza = item.CodigoNatureza,
                    DescricaoNatureza = item.DescricaoNatureza,
                    Qualidade = decimal.Parse((item.QualidadeTrinca * 100).ToString("n2"))
                });
            };

            return result;            
        }

        public static void Release()
        {
            _instance = null;
            _instrumentos = null;
            _bens = null;
        }
    }
}
